/**
  * Author: Mei
  * Date: 2020-12-25 9:36
  * Description: lock_guard互斥量的使用
  *
  */
#include "head.h"

using namespace std;
/**
 * lock和unlock必须成对出现 lock会阻塞  不想阻塞可以使用try_lock()
 */
mutex g_lock;

void func() {
    /**
     * lock_guard 在构造函数种会自动锁定互斥量，而在退出作用域后进行析构时就会自动解锁，
     * 从而保证了互斥量的正确操作，避免忘记unlock操作
     * lock_guard用到了RAII技术(在类的构造函数种分配资源，在析构函数种释放资源，保证资源在出了作用于之后就释放)
     * 但lock_guard不能手动释放锁 必须要等待生命期结束才能释放 这是与unique_lock的区别
     */
    lock_guard<mutex> lock(g_lock); //不同步的话输出比较乱
    cout << "entered thread "<<this_thread::get_id() << endl;
    this_thread::sleep_for(chrono::seconds(1));
    cout << "leaving thread "<<this_thread::get_id() << endl;


}
int main() {
    //1、独占互斥量
    thread t1(func);
    thread t2(func);
    thread t3(func);

    t1.join();
    t2.join();
    t3.join();
    return 0;
}